package com.xjh.basestudy.lanqiaobei;

import java.util.Arrays;
import java.util.Scanner;

public class qianzhuihe {
    public static void main(String[] args) {
        /**
         * 计算它们两两相乘后再相加的和。即计算如下的表达式：
         *S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+a2⋅a4+⋯+an−1⋅an
         * */
//        violent();
//        qianzhuiheMethod();
        stand();

    }

    /**
     * 普通方法：嵌套for循环，时间复杂度高 （mxn）
     */
    public static void violent() {
        Scanner scanner = new Scanner(System.in);

        // 输入n:第一行是n个整数
        int n = scanner.nextInt();

        // 第二行是具体数字内容： 输入数组a
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }

        // 普通方法计算S
        long S = 0;
//         固定i，遍历j，j要在i的基础上加1
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                long sum = (long) a[i] * a[j];
                S = S + sum;
            }
        }

        // 输出结果 n=3, arr=[1,2,3]  S= 1*2 + 1*3 + 2*3 = 11
        System.out.println(S);
    }

    /**
     * 1.初始化前缀和数组： 前缀和数组 prefix[i] 表示数组 a 中前 i 个元素的和（意思是构建一个新数组，这个数组中每个元素都是原数组中前i个元素的和）
     * 2.构建前缀和数组： 通过遍历原数组 a，逐步计算每个前缀和并存储在 prefix 数组中。这个过程的时间复杂度是 O(n)。
     * 3.利用前缀和数组进行快速计算： 如果我们想要快速计算数组 a 中任意区间 [i, j] 的和，可以利用前缀和数组来实现：
     * <p>
     * int []a = new int[10]; a 是一个大小为 10 的数组。
     * int []sum = new int[11]; sum 是一个大小为 11 的数组，sum[i] 用来存储数组 a 中元素的前缀和。
     * for (int i = 1; i < 11; i++) { 在 for 循环中，sum[i] 等于 a[i-1] 与 sum[i-1] 的和，这意味着每个 sum[i] 存储了 a 数组从 a[0] 到 a[i-1] 的累积和。
     * sum[i] = a[i-1] + sum[i-1];
     * }
     */
    public static void qianzhuiheMethod() {

        Scanner scanner = new Scanner(System.in);

        // 输入n
        int n = scanner.nextInt();

        // 输入数组a
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }

        // 前缀和方法计算S
        long totalSum = 0;
        for (int i = 0; i < n; i++) {
            totalSum += a[i]; // 累加数组的总和  6
        }

        long S = 0;
        for (int i = 0; i < n; i++) { // i = 0 1 2
            totalSum -= a[i];  // 移除当前元素 移除1；2；3
            S += (long) a[i] * totalSum;  // 当前元素与其后面所有元素的和 1*5+2*3+3*0= 11
        }

        // 输出结果
        System.out.println(S);
    }

    public static void stand() {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }
        int[] sum = new int[n + 1];
        for (int i = 1; i < n + 1; i++) {
            sum[i] = a[i - 1] + sum[i - 1];
        }
        System.out.println(Arrays.toString(sum));
    }
}

